package com.shujia

/**
 * 面向函数编程之以函数作为返回值
 */
object Demo08Func04 {

  /**
   * 函数可以在函数中定义
   * 如果以函数作为返回值时，不能自动推断，需要手动指定返回值类型
   *
   */
  def func1(str: String): Int => Int = {

    // Int => Int
    def func2(int: Int): Int = {
      str.toInt + int + 100
    }

    func2
  }

  // 简化版
  def func1_simple(str: String)(int: Int): Int = str.toInt + int + 100

  /**
   * 函数的柯里化：将有N个参数的函数转化成N个只有一个参数的函数
   * 即将函数func2转换成函数func1_simple
   */
  def func2(str: String, int: Int): Int = str.toInt + int + 100


  def main(args: Array[String]): Unit = {
    /**
     * 调用func1，需要调用两次
     * 调用一次会得到一个函数
     * 所以还需要再调用一次
     */
    val intToInt: Int => Int = func1("100")
    val res: Int = intToInt(200)
    println(res)

    // 对简化版进行调用
    val intToInt1: Int => Int = func1_simple("200")
    val res1: Int = intToInt1(300)
    println(res1)

  }

}
